package com.foo.designpattern.composite.safecomposite;

import java.util.ArrayList;
import java.util.List;

/**
 * com.foo.designpattern.composite.safecomposite
 * Created with IntelliJ IDEA.
 * Created by jiang on 2016-05-20 15:59.
 *
 * @Description 树枝构件(Composite)角色
 * 树枝构件角色：代表参加组合的有下级子对象的对象。
 * 树枝构件类给出所有的管理子对象的方法，如add()、remove()、getChild().
 */

public class Composite implements Component {
    // 用来存储组合对象中包含的子组件对象
    private List<Component> childComponents = new ArrayList<Component>();
    // 组合对象的名称
    private String name;

    /**
     * 构造方法：初始化组合对象的名字信息
     *
     * @param name 组合对象的名字
     */
    public Composite(String name) {
        this.name = name;
    }


    /**
     * 聚集管理方法：增加一个子构件对象
     *
     * @param child 子组件对象
     */
    public void addChild(Component child) {
        childComponents.add(child);
    }

    /**
     * 聚集管理方法：删除一个子构件对象
     *
     * @param index 子构件对象的下标
     */
    public void removeChild(int index) {
        childComponents.remove(index);
    }

    /**
     * 聚集管理方法：返回所有子构件对象
     *
     * @return 所有子构件对象的集合
     */
    public List<Component> getAllChild() {
        return childComponents;
    }

    /**
     * 输出对象的自身结构
     *
     * @param preStr 前缀，主要是按照层级拼接空格，实现向后缩进
     */
    @Override
    public void printStructure(String preStr) {
        // 先把自己输出
        System.out.println(preStr + "+" + this.name);
        // 如果还包含有子组件，那么就输出这些子组件对象
        if (null != this.childComponents) {
            // 添加两个空格，表示向后缩进两个空格
            preStr += "  ";
            // 输出当前对象的子对象
            for (Component childComponent : childComponents) {
                // 递归输出每个子对象
                childComponent.printStructure(preStr);
            }
        }
    }

}
